package araujoCoronelVillamayor.plantasVsZombies.domain

import org.junit.After
import org.junit.Assert
import org.junit.Before
import org.junit.Test
import araujoCoronelVillamayor.plantasVsZombies.appModelsArena.AtaqueAppModel
import araujoCoronelVillamayor.plantasVsZombies.appModelsArena.SesionAppModel

class TestJardin {
	FactoryPlantas factoryPlantas
	Planta planta1
	Planta planta2
	Planta planta3 
	
	FactoryZombies factoryZombies 
	Zombie zombie1
	Zombie zombie2
	
	//Jardin jardinUnico
	
	AtaqueAppModel ataqueAppModel
	SesionAppModel sesionAppModel
	
	@Before
	def void init() {
		sesionAppModel = new SesionAppModel
		ataqueAppModel = new AtaqueAppModel(sesionAppModel)
		
		//jardinUnico = new Jardin
				
		factoryPlantas = FactoryPlantas.instance
		planta1 = factoryPlantas.crearShooter() //ATAQUE: 4 || DEFENSA: 2	
		planta2 = factoryPlantas.crearGirasol() //ATAQUE: 1 || DEFENSA: 5
		planta3 = factoryPlantas.crearPirana() //ATAQUE: 5 || DEFENSA: 1
				
		factoryZombies = FactoryZombies.getInstance
		zombie1 = factoryZombies.crearColinBlunstone() //ATAQUE: 1 || DEFENSA: 4
		zombie2 = factoryZombies.crearCranberrie() //ATAQUE: 4 || DEFENSA: 1
	}
	
	@Test //(expected=typeof(Exception))
	def probarInicializacionJardin(){
		//Ahora las filas del jardin se inicializan en "SesionAppModel"
		//Assert::assertEquals(3, jardinUnico.cantidadFilas)
		Assert::assertEquals(6, sesionAppModel.jardin.cantidadFilas)
		
		//Verifico que no haya plantas en las filas de los jardines
		/*
		Assert::assertFalse(jardinUnico.getFilas.get(0).hayPlantas)
		Assert::assertFalse(jardinUnico.getFilas.get(1).hayPlantas)
		Assert::assertFalse(jardinUnico.getFilas.get(2).hayPlantas)
		*/
		Assert::assertTrue(sesionAppModel.jardin.getFilas.get(0).hayPlantas)
		Assert::assertTrue(sesionAppModel.jardin.getFilas.get(1).hayPlantas)
		Assert::assertFalse(sesionAppModel.jardin.getFilas.get(2).hayPlantas)
		Assert::assertTrue(sesionAppModel.jardin.getFilas.get(3).hayPlantas)
		Assert::assertTrue(sesionAppModel.jardin.getFilas.get(4).hayPlantas)
		Assert::assertTrue(sesionAppModel.jardin.getFilas.get(5).hayPlantas)
		
		//Verifico los espacios en las filas
		Assert::assertFalse(sesionAppModel.jardin.getFilas.get(0).hayEspacio)
		Assert::assertTrue(sesionAppModel.jardin.getFilas.get(1).hayEspacio)
		Assert::assertTrue(sesionAppModel.jardin.getFilas.get(2).hayEspacio)
		Assert::assertFalse(sesionAppModel.jardin.getFilas.get(3).hayEspacio)
		Assert::assertTrue(sesionAppModel.jardin.getFilas.get(4).hayEspacio)
		Assert::assertTrue(sesionAppModel.jardin.getFilas.get(5).hayEspacio)
		
		//Verifico si los nombres se generaron bien
		/*
		Assert::assertEquals("Fila #0", jardinUnico.getFilas.get(0).getNombre)
		Assert::assertEquals("Fila #1", jardinUnico.getFilas.get(1).getNombre)
		Assert::assertEquals("Fila #2", jardinUnico.getFilas.get(2).getNombre)
		*/
	}
	
	@Test //(expected=typeof(Exception))
	def probarOtrosMetodosFilaAlInicializarElJardin(){
		//Devuelve null si le pido la última planta y no tiene plantas cargadas
		/*
		Assert::assertNull(jardinUnico.getFilas.get(0).ultimaPlanta())
		Assert::assertNull(jardinUnico.getFilas.get(1).ultimaPlanta())
		Assert::assertNull(jardinUnico.getFilas.get(2).ultimaPlanta())
		*/
		Assert::assertNull(sesionAppModel.jardin.getFilas.get(2).ultimaPlanta())
//		Assert::assertNull(sesionAppModel.jardin.getFilas.get(1).ultimaPlanta())
//		Assert::assertNull(sesionAppModel.jardin.getFilas.get(2).ultimaPlanta())
//		Assert::assertNull(sesionAppModel.jardin.getFilas.get(3).ultimaPlanta())
//		Assert::assertNull(sesionAppModel.jardin.getFilas.get(4).ultimaPlanta())
//		Assert::assertNull(sesionAppModel.jardin.getFilas.get(5).ultimaPlanta())
		
		//No modifica la colección si le especifico quitar una planta que no existe
		/*
		jardinUnico.getFilas.get(0).quitarPlanta(planta1)
		Assert::assertFalse(jardinUnico.getFilas.get(0).hayPlantas)
		jardinUnico.getFilas.get(1).quitarPlanta(planta1)
		Assert::assertFalse(jardinUnico.getFilas.get(1).hayPlantas)
		jardinUnico.getFilas.get(2).quitarPlanta(planta1)
		Assert::assertFalse(jardinUnico.getFilas.get(2).hayPlantas)
		
		jardinUnico.getFilas.get(0).quitarPlanta(planta2)
		Assert::assertFalse(jardinUnico.getFilas.get(0).hayPlantas)
		jardinUnico.getFilas.get(1).quitarPlanta(planta2)
		Assert::assertFalse(jardinUnico.getFilas.get(1).hayPlantas)
		jardinUnico.getFilas.get(2).quitarPlanta(planta2)
		Assert::assertFalse(jardinUnico.getFilas.get(2).hayPlantas)
		
		jardinUnico.getFilas.get(0).quitarPlanta(jardinUnico.getFilas.get(0).ultimaPlanta)
		Assert::assertFalse(jardinUnico.getFilas.get(0).hayPlantas)
		jardinUnico.getFilas.get(1).quitarPlanta(jardinUnico.getFilas.get(1).ultimaPlanta)
		Assert::assertFalse(jardinUnico.getFilas.get(1).hayPlantas)
		jardinUnico.getFilas.get(2).quitarPlanta(jardinUnico.getFilas.get(2).ultimaPlanta)
		Assert::assertFalse(jardinUnico.getFilas.get(2).hayPlantas)
		*/
		sesionAppModel.jardin.getFilas.get(0).quitarPlanta(planta1)
		Assert::assertTrue(sesionAppModel.jardin.getFilas.get(0).hayPlantas)
		sesionAppModel.jardin.getFilas.get(1).quitarPlanta(planta1)
		Assert::assertTrue(sesionAppModel.jardin.getFilas.get(1).hayPlantas)
		sesionAppModel.jardin.getFilas.get(2).quitarPlanta(planta1)
		Assert::assertFalse(sesionAppModel.jardin.getFilas.get(2).hayPlantas)
		
		sesionAppModel.jardin.getFilas.get(0).quitarPlanta(planta2)
		Assert::assertTrue(sesionAppModel.jardin.getFilas.get(0).hayPlantas)
		sesionAppModel.jardin.getFilas.get(1).quitarPlanta(planta2)
		Assert::assertTrue(sesionAppModel.jardin.getFilas.get(1).hayPlantas)
		sesionAppModel.jardin.getFilas.get(2).quitarPlanta(planta2)
		Assert::assertFalse(sesionAppModel.jardin.getFilas.get(2).hayPlantas)
		
		sesionAppModel.jardin.getFilas.get(0).quitarPlanta(sesionAppModel.jardin.getFilas.get(0).ultimaPlanta)
		Assert::assertTrue(sesionAppModel.jardin.getFilas.get(0).hayPlantas)
		sesionAppModel.jardin.getFilas.get(1).quitarPlanta(sesionAppModel.jardin.getFilas.get(1).ultimaPlanta)
		Assert::assertTrue(sesionAppModel.jardin.getFilas.get(1).hayPlantas)
		sesionAppModel.jardin.getFilas.get(2).quitarPlanta(sesionAppModel.jardin.getFilas.get(2).ultimaPlanta)
		Assert::assertFalse(sesionAppModel.jardin.getFilas.get(2).hayPlantas)
	}
	
	@Test //(expected=typeof(Exception))
	def probarCargarPlantas(){
		sesionAppModel.jardin.getFilas.get(2).plantar(planta1) //ATAQUE: 4 || DEFENSA: 2
		Assert::assertTrue(sesionAppModel.jardin.getFilas.get(2).hayPlantas)
		Assert::assertTrue(sesionAppModel.jardin.getFilas.get(2).hayEspacio)
	
		sesionAppModel.jardin.getFilas.get(2).plantar(planta2) //ATAQUE: 1 || DEFENSA: 5
		Assert::assertTrue(sesionAppModel.jardin.getFilas.get(2).hayPlantas)
		Assert::assertTrue(sesionAppModel.jardin.getFilas.get(2).hayEspacio)
	
		sesionAppModel.jardin.getFilas.get(2).plantar(planta3) //ATAQUE: 5 || DEFENSA: 1
		Assert::assertTrue(sesionAppModel.jardin.getFilas.get(2).hayPlantas)
		Assert::assertFalse(sesionAppModel.jardin.getFilas.get(2).hayEspacio)
	}
	
	@Test
	def probarAtaqueEliminacionPlantas(){

		ataqueAppModel.zombieSeleccionado = zombie1
		sesionAppModel.plantaSeleccionada = planta3
		sesionAppModel.filaSeleccionada = sesionAppModel.jardin.getFilas.get(2)
		sesionAppModel.poner

		Assert::assertTrue(sesionAppModel.jardin.getFilas.get(2).hayPlantas)
		Assert::assertTrue(sesionAppModel.jardin.getFilas.get(2).hayEspacio)

		ataqueAppModel.atacar(sesionAppModel.filaSeleccionada, ataqueAppModel.zombieSeleccionado)
		
		Assert::assertFalse(sesionAppModel.jardin.getFilas.get(2).hayPlantas)
		Assert::assertTrue(sesionAppModel.jardin.getFilas.get(2).hayEspacio)
	}
	
	@After
	def void borrarPlantas() {
		/*
		jardinUnico.getFilas.get(0).getCasillerosPlanta.clear
		jardinUnico.getFilas.get(1).getCasillerosPlanta.clear
		jardinUnico.getFilas.get(2).getCasillerosPlanta.clear
		*/
		sesionAppModel.jardin.getFilas.get(0).casillerosPlanta.clear
		sesionAppModel.jardin.getFilas.get(1).casillerosPlanta.clear
		sesionAppModel.jardin.getFilas.get(2).casillerosPlanta.clear
		sesionAppModel.jardin.getFilas.get(3).casillerosPlanta.clear
		sesionAppModel.jardin.getFilas.get(4).casillerosPlanta.clear
		sesionAppModel.jardin.getFilas.get(5).casillerosPlanta.clear
	}
}